home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 December / CHIPNET Aralık 1997.iso / linux / redhat / misc / src / install / cdrom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-11  |  3.8 KB  |  187 lines

  1. #include <fcntl.h>
  2. #include <linux/types.h>
  3. #include <linux/cdrom.h>
  4. #include <sys/ioctl.h>
  5. #include <strings.h>
  6. #include <newt.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9.  
  10. #include "devices.h"
  11. #include "install.h"
  12. #include "log.h"
  13. #include "newt.h"
  14. #include "scsi.h"
  15. #include "windows.h"
  16.  
  17. #define CD_IDE 1
  18. #define CD_SCSI 2
  19. #define CD_OTHER 3
  20.  
  21. static struct { char * modname, * devname; } transTable[] = {
  22.     { "cm206", "cm206cd" },
  23.     { "sonycd535", "cdu535" },
  24.     { NULL, NULL }
  25. } ;
  26.  
  27.  
  28. #ifdef __i386__
  29. static int setupCDdevicePanel(int * type) {
  30.     newtComponent form, label, listbox, okay, cancel, answer;
  31.  
  32.     newtOpenWindow(22, 6, 35, 11, "CDROM type");
  33.  
  34.     label = newtLabel(1, 1, "What type of CDROM do you have?");
  35.     listbox = newtListbox(10, 3, 0, NEWT_LISTBOX_RETURNEXIT);
  36.  
  37.     newtListboxAddEntry(listbox, "SCSI", (void *) CD_SCSI);
  38.     newtListboxAddEntry(listbox, "Other CDROM", (void *) CD_OTHER);
  39.     
  40.     okay = newtButton(5, 7, "Ok");
  41.     cancel = newtButton(20, 7, "Cancel");
  42.  
  43.     form = newtForm(NULL, NULL, 0);
  44.     newtFormAddComponents(form, label, listbox, okay, cancel, NULL);
  45.  
  46.     answer = newtRunForm(form);
  47.  
  48.     if (answer != cancel)
  49.     *type = (int) newtListboxGetCurrent(listbox);
  50.  
  51.     newtFormDestroy(form);
  52.     newtPopWindow();
  53.  
  54.     if (answer == cancel) return INST_CANCEL;
  55.  
  56.     return 0;
  57. }
  58. #endif /* __i386__ */
  59.  
  60. #ifndef __sparc__
  61. int findAtapi(char ** cddev) {
  62.     char * dev;
  63.     int i, fd;
  64.     struct cdrom_volctrl volctrl;
  65.  
  66.     dev = alloca(105);
  67.     strcpy(dev, "/tmp/hda");
  68.  
  69.     for (i = 0; i < 8; i++, dev[7]++) {
  70.     logMessage("seeing if %s is ATAPI CD", dev);
  71.     devMakeInode(dev + 5, dev);
  72.     fd = open(dev, O_RDONLY);
  73.     if (fd < 0) {
  74.         logMessage("    failed to open device");
  75.         continue;
  76.     }
  77.  
  78.     unlink(dev);
  79.     if (!ioctl(fd, CDROMVOLREAD, &volctrl)) {
  80.         logMessage("    CDROMVOLREAD ioctl worked");
  81.         close(fd);
  82.         *cddev = strdup(dev + 5);
  83.         return 0;
  84.     };
  85.  
  86.     close(fd);
  87.     }
  88.  
  89.     return INST_ERROR;
  90. }
  91. #endif /* ! __sparc__ */
  92.     
  93. int setupCDdevice(char ** cddev, struct driversLoaded ** dl) {
  94.     int type, rc = 0;
  95.     struct driversLoaded * d;
  96.     int i;
  97.     int done = 0;
  98.  
  99.     #ifndef __sparc__
  100.     /* Let's see if any CDROM's are already available */
  101.     if (!findAtapi(cddev)) {
  102.         logMessage("using device %s", *cddev);
  103.         done = 1;
  104.     }
  105.     #endif
  106.  
  107.     if (!done) {
  108.     #if defined(__sparc__) || defined(__alpha__)
  109.         /* It must be SCSI -- we'll give an error later if this is wrong */
  110.         setupSCSIInterfaces(1, dl);
  111.         *cddev = "scd0";
  112.         done =1;
  113.     #else
  114.         if (!findSCSIcdrom(cddev)) done = 1;
  115.     #endif
  116.     }
  117.  
  118.     #ifdef __i386__
  119.     while (rc || !done) {
  120.         rc = setupCDdevicePanel(&type);
  121.         if (rc) return rc;
  122.  
  123.         switch (type) {
  124.           case CD_SCSI:
  125.         setupSCSIInterfaces(1, dl);
  126.         *cddev = "scd0";
  127.         done = 1;
  128.         break;
  129.  
  130.           case CD_OTHER:
  131.         rc = loadDeviceDriver(DRIVER_CDROM, dl);
  132.         if (!rc) {
  133.             d = *dl;
  134.             *cddev = "bad_device";
  135.             while (d) {
  136.             if (d->type == DRIVER_CDROM) {
  137.                 *cddev = d->module;
  138.                 break;
  139.             }
  140.             d = d->next;
  141.             }
  142.  
  143.             for (i = 0; transTable[i].modname; i++) {
  144.             if (!strcmp(*cddev, transTable[i].modname)) {
  145.                 *cddev = transTable[i].devname;
  146.                 break;
  147.             }
  148.             }
  149.             done = 1;
  150.         }
  151.         break;
  152.         }
  153.     } 
  154.     #endif /* __i386__ */
  155.  
  156.     winStatus(35, 3, "CDROM", "Initializing CDROM...");
  157.     sleep(2);
  158.     newtPopWindow();
  159.  
  160.     return 0;
  161. }
  162.  
  163. int removeCDmodule(struct driversLoaded ** dl) {
  164.     /* this wil fail silently if no CD module has been loaded */
  165.     removeDeviceDriver(DRIVER_CDROM, dl);
  166.  
  167.     return 0;
  168. }
  169.  
  170. int findSCSIcdrom(char ** cddev) {
  171.     int fd;
  172.     int rc = INST_ERROR;
  173.  
  174.     /* If they have a SCSI CDROM already available, use it */
  175.     devMakeInode("scd0", "/tmp/scd0");
  176.     fd = open("/tmp/scd0", O_RDONLY);
  177.     if (fd >= 0) {
  178.     logMessage("found SCSI CDROM scd0");
  179.     *cddev = strdup("scd0");
  180.     close(fd);
  181.     rc = 0;
  182.     }
  183.     unlink("/tmp/scd0");
  184.  
  185.     return rc;
  186. }
  187.